package model;

import java.util.Arrays;
import java.util.Comparator;

public class Inventory {
	protected EquippableItem[] equippableItems = new EquippableItem[10];
	protected UseableItem[] useableItems = new UseableItem[10];
	
	protected int numEquippableItems = 0;
	protected int numUseableItems = 0;
	
	
	private Comparator <Item> compareByItem = new TakeableItem();
	
	public boolean addItem(TakeableItem i)
	{
		//decides which array to pass to addTakeableItem
		if(i.getClass().equals(equippableItems.getClass()))
		{
			EquippableItem[] e = (EquippableItem[])addTakeableItem(i, equippableItems, numEquippableItems);
			if(e != null)
			{
				equippableItems = e;
				numEquippableItems++;
				return(true);
			}
		}
		else if(i.getClass().equals(useableItems.getClass()))
		{
			UseableItem[] u = (UseableItem[])addTakeableItem(i, useableItems, numUseableItems);
			if(u != null)
			{
				useableItems = u;
				numUseableItems++;
				return(true);
			}
		}

		return(false);
	}
	private TakeableItem[] addTakeableItem(TakeableItem i, TakeableItem[] items, int numItems)
	{
		//logic for adding a takeable item to either useableItems or equippableItems, will
		//double the size of the array if necessary, add the item, and then sort the array
		numItems++;
		if(numItems > items.length)
		{
			TakeableItem[] tempItems = new TakeableItem[2 * items.length];
			for(int o = 0; o < items.length; o++)
			{
				tempItems[o] = items[o];
			}
			items = tempItems;
		}
		items[numItems - 1] = i;
		Arrays.sort(items, 0, numItems-1, compareByItem);
		return(items);
	}
	public TakeableItem dropItem(TakeableItem i)
	{
		//decides which class to pass to dropTakeableItem
		TakeableItem result = null;
		if(i.getClass().equals(equippableItems.getClass()))
		{
			result = dropTakeableItem(i, equippableItems, numEquippableItems);
			if(result!=null)
			{
				numEquippableItems--;
			}
		}
		else if(i.getClass().equals(useableItems.getClass()))
		{
			result = dropTakeableItem(i, useableItems, numUseableItems);
			if(result!=null)
			{
				numUseableItems--;
			}
		}
		return(result);
	}
	private TakeableItem dropTakeableItem(TakeableItem i, TakeableItem[] items, int numItems)
	{
		//removes Takeable item i from array and shifts remaining TakeableItems left
		int index = Arrays.binarySearch(items, i, compareByItem);
		if((index >= 0)&&(items[index].equals(i)))
		{
			for(int o = index; o < numItems - 1; o++)
			{
				items[o] = items[o+1];
			}
			numItems--;
			items[numItems] = null;
			return (i);
		}
		else
		{
			return(null);
		}
	}
	public UseableItem[] getUseableItems()
	{
		return(useableItems);
	}
	public EquippableItem[] getEquippableItems()
	{
		return(equippableItems);
	}
}
